/*
 * ====================================================================
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 */
package com.luckdraw.util;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.nutz.json.Json;
import org.nutz.lang.Xmls;
import org.nutz.lang.util.NutMap;

/**
 * This example demonstrates how to create secure connections with a custom SSL
 * context.
 */
public class Test {
	
	private static final String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";

	public final static void main(String[] args) throws Exception {
		String re_openid = "oJB9FwEWjToJ24w04RFglOHSPCiA";// 用户openid

		int total_amount = 100;// 付款金额 付款金额，单位分

		String mch_id = "1435854302";
		String mch_appid = "wx15130e94c3774a68";

		KeyStore keyStore = KeyStore.getInstance("PKCS12");
		FileInputStream instream = new FileInputStream(Constant.APICLIENT_CERT);
		try {
			keyStore.load(instream, mch_id.toCharArray());
		} finally {
			instream.close();
		}
		// Trust own CA and all self-signed certs
		SSLContext sslcontext = SSLContexts.custom().loadKeyMaterial(keyStore, mch_id.toCharArray()).build();
		// Allow TLSv1 protocol only
		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { "TLSv1" }, null,
				SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
		CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
		try {

			HttpPost httpget = new HttpPost(url);

			NutMap m = NutMap.NEW();

			m.put("mch_appid", mch_appid);
			m.put("mchid", mch_id);
			m.put("nonce_str", GetUUID.getUUID());

			String mch_billno = CreateOrderNum.create(mch_id);// 商户订单号
			m.put("partner_trade_no", mch_billno);

			m.put("openid", re_openid);

			m.put("check_name", "NO_CHECK");
			m.put("amount", String.valueOf(total_amount));

			m.put("desc", Constant.REMARK);

			m.put("spbill_create_ip", Constant.CLIENT_IP);

			String sign = TenpayUtil.genPackageSign(TenpayUtil.toSortedMap(m), "bei1jing2qing3ce4wen5hua6length9");// 签名
			m.put("sign", sign);
			System.out.println(Json.toJson(m));
			String xml = Xmls.mapToXml(m);

			httpget.setEntity(new StringEntity(xml, "UTF-8"));
			System.out.println("executing request" + httpget.getRequestLine());

			CloseableHttpResponse response = httpclient.execute(httpget);
			try {
				HttpEntity entity = response.getEntity();
				System.out.println("----------------------------------------");
				System.out.println(response.getStatusLine());
				if (entity != null) {
					System.out.println("Response content length: " + entity.getContentLength());
					BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent(),"UTF-8"));
					String text;
					String s = "";
					while ((text = bufferedReader.readLine()) != null) {
						s += text;
					}
					System.out.println(s);
				}
				EntityUtils.consume(entity);
			} finally {
				response.close();
			}
		} finally {
			httpclient.close();
		}
	}

}
